package cn.easyutil.project.web.util;



import cn.easyutil.util.javaUtil.LoggerUtil;

import java.io.*;

/**
 * 上传工具
 * @author spc
 *
 */
public class UploadUtil {


	/** 单例链接*/
//    private volatile OSSClient ossClient;
    /** oss-cdn域名*/
    private String endPoint;
    private String bucketName;
    private String accessKeyId;
    private String accessKeySecret;
    
    public UploadUtil(){}
    
    /**
     * 文件上传
     * @param input	文件流
     * @param fileName	文件名称
     * @param postfix	文件后缀名
     * @param filePath	文件路径
     * @param useOSS	是否使用oss   false:本地存储
     * @return
     */
    public String upload(InputStream input,String fileName,String postfix,String filePath,boolean useOSS){
    	if(useOSS){
    		return OSSUpload(input, fileName, postfix, filePath);
    	}else{
    		return localUpload(input, fileName, postfix, filePath);
    	}
    }
    /**
     * 文件上传
     * @param input	文件流
     * @param fileName	文件名称
     * @param postfix	文件后缀名
     * @param filePath	文件路径
     * @return	文件最终存放的绝对路径
     */
    public String upload(InputStream input,String fileName,String postfix,String filePath){
    	return upload(input, fileName, postfix, filePath, true);
    }
    /**
     * 初始化阿里oss参数
     * @param bucketName
     * @param accessKeyId
     * @param accessKeySecret
     */
    public UploadUtil(String bucketName, String accessKeyId, String accessKeySecret, String endpoint){
    	this.bucketName = bucketName;
    	this.accessKeyId = accessKeyId;
    	this.accessKeySecret = accessKeySecret;
    	this.endPoint = endpoint;
    }
    /**
     * 文件上传
     * @param input	文件流
     * @param fileName	文件名称
     * @param postfix	文件后缀名
     * @param filePath	文件路径
     * @return	文件最终存放的绝对路径
     */
    public String OSSUpload(InputStream input,String fileName,String postfix,String filePath){
//    	if(this.accessKeyId==null || this.accessKeySecret==null || this.bucketName==null || this.endPoint==null){
//    		throw new RuntimeException("oss初始化参数缺失");
//    	}
//    	long start = System.currentTimeMillis();
//    	//最终文件全路径
//    	String finalPath = filePath+fileName+"."+postfix;
//		OSSClient client = getClient();
//		boolean found = client.doesObjectExist(this.bucketName, filePath+fileName+"."+postfix);
//		//创建上传Object的Metadata
//        ObjectMetadata metadata = new ObjectMetadata();
//        int size = 0;
//        try {
//        	size = input.available();
//            metadata.setContentLength(size);
//            LoggerUtil.info(this.getClass(), "oss文件上传,文件大小:"+size+",文件名:"+fileName+",文件存放路径:"+filePath);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        metadata.setCacheControl("no-cache");
//        metadata.setHeader("Pragma", "no-cache");
//        //设置文件网络类型
////            metadata.setContentType(fileType);
//        metadata.setContentDisposition("filename/filesize=" + fileName + "/" + size + "Byte.");
//        try {
//        	LoggerUtil.info(this.getClass(),"oss文件上传开始");
//        	client.putObject(bucketName,finalPath , input, metadata);
//        	long end = System.currentTimeMillis();
//        	LoggerUtil.info(this.getClass(),"oss文件上传完成,总耗时:"+(end-start)/1000+"秒,路径为:"+finalPath);
//		} catch (Exception e) {
//			LoggerUtil.info(this.getClass(), "oss文件上传失败:"+e.getMessage());
//		}
//        return finalPath;
//    }
//    // 初始化秘钥信息
//    private OSSClient getClient() {
//        if (ossClient == null) {
//            synchronized (OSSClient.class) {
//                if (ossClient == null) {
//                    ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
//                }
//            }
//        }
        return null;
    }
    
    public String localUpload(InputStream input,File file){
    	FileOutputStream fout = null;
    	try {
    		int size = input.available();
    		LoggerUtil.info(this.getClass(), "本地文件存储,文件大小:"+size+",文件名:"+file.getName()+",文件存放路径:"+file.getAbsolutePath());
    		fout = new FileOutputStream(file);
			byte[] but = new byte[1024*1024];
			int length = 0;
			while((length = input.read(but)) != -1){
				fout.write(but, 0, length);
			}
			fout.flush();
		} catch (Exception e) {
			LoggerUtil.info(this.getClass(), "本地文件存储失败:"+e.getMessage());
			throw new RuntimeException(e);
		}finally{
			try {
				fout.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
    	LoggerUtil.info(this.getClass(), "本地文件存储成功,路径为:"+file.getAbsolutePath());
    	return file.getAbsolutePath();
    }
    
    /**
     * 文件流存放本地
     * @param input	文件流
     * @param fileName	文件名
     * @param postfix	文件后缀名
     * @param filePath	存放的文件夹路径
     * @return	文件最终存放的绝对路径
     */
    public String localUpload(InputStream input,String fileName,String postfix,String filePath){
    	filePath = filePath.replace("\\", "/");
    	if(!filePath.endsWith("/")){
    		filePath = filePath+"/";
    	}
    	File file2 = new File(filePath.substring(0,filePath.lastIndexOf("/")));
    	if (!file2.exists()){
    		file2.mkdir();
		}
    	//最终文件全路径
    	String finalPath = filePath+fileName+"."+postfix;
    	File file = new File(finalPath);
    	return localUpload(input, file);
    	
    }
    
    /**
     * 读取本地文件并转成byte字节
     * @param filePath
     * @return
     */
    public byte[] localDown(String filePath){
    	File file = null;
    	FileInputStream fin = null;
    	ByteArrayOutputStream out = null;
    	try {
    		file= new File(filePath);
			if(!file.exists()){
				throw new RuntimeException("文件不存在:"+filePath);
			}
			out = new ByteArrayOutputStream();
			fin = new FileInputStream(file);
			byte[] but = new byte[1024*1024];
			int length = 0;
			while((length=fin.read(but)) != -1){
				out.write(but, 0, length);
			}
			return out.toByteArray();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			try {
				fin.close();
				out.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
    }
}
